[Coding029] 图 - 最短路径

Dijkstra算法 - 迪杰斯特拉算法

Ben 2024/01/25

More coding records

Get the knowledge flowing and circulating! :)

目录

标题:Dijkstra算法

概念

迪杰斯特拉算法(英语:Dijkstra's algorithm),又称戴克斯特拉算法。是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法。Dijkstra算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题

img

戴克斯特拉算法运行演示(找到a,b之间的最短路)
本算法每次取出未访问结点中距离最小的,用该结点更新其他结点的距离。在演示过程中访问过的结点会被标为红色。

该算法解决了图 G=V,E 上带权的单源最短路径问题具体来说Dijkstra算法设置了一顶点集合 S ,在集合 S 中所有的顶点与源点 s 之间的最终最短路径权值均已确定。算法反复选择最短路径估计最小的顶点 uVS 并将 u 加入 S 中。该算法常用于路由算法或者作为其他图算法的一个子模块。

举例来说,如果图中的顶点表示城市,而边上的权重表示城市间开车行经的距离,该算法可以用来找到两个城市之间的最短路径。

  • 应当注意,绝大多数的Dijkstra算法不能有效处理带有负权边的图。

  • Dijkstra算法在计算机科学的人工智能等领域也被称为均一开销搜索,并被认为是最良优先搜索的一个特例。

——维基百科

实例

img

样例图. 有向带权图 G

image-20240125093328534

邻接表. 根据头插法建立的邻接表

image-20240125171432880

Result. 从源点 0 到其他各个顶点的最短路线

部分代码解读

1. 邻接表的建立

image-20240125161004688

邻接表的组成
代码

 

2. 处理每个节点(手绘理解过程)

image-20240125164246840

 

整体执行过程

image-20240125170206742

结果的构造

image-20240125170057833

 

完整代码

line167 ~ line186

image-20240125162239778

运行结果

image-20240125094222464